package com.jlhlyby.other;

/**
 * 98. 打家劫舍
 * 你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
 * <p>
 * 给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：[1,2,3,1]
 * 输出：4
 * 解释：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。
 * 偷窃到的最高金额 = 1 + 3 = 4 。
 * 示例 2：
 * <p>
 * 输入：[2,7,9,3,1]
 * 输出：12
 * 解释：偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9)，接着偷窃 5 号房屋 (金额 = 1)。
 * 偷窃到的最高金额 = 2 + 9 + 1 = 12 。
 * <p>
 * <p>
 * 提示：
 * <p>
 * 0 <= nums.length <= 100
 * 0 <= nums[i] <= 400
 */
public class ThiefValue {
    /**
     * 解法：动态规划+滑动窗口
     * 问题可以简化为 第k个房间如果选择，那么他就是k+MaxSum(k-2）
     * 如果不选择k则是MaxSum(k-1).在两者中选择最大值
     * 边界条件，一间房就一个。两间房就选最大的
     *
     * @param args
     */
    public static void main(String[] args) {
        int[] nums = new int[]{2, 7, 9, 3, 1};
        System.out.println(rob(nums));

    }

    public static int rob(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        if (nums.length == 1) {
            return nums[0];
        }
        int first = nums[0];
        int second = Math.max(nums[0], nums[1]);
        for (int i = 2; i < nums.length; i++) {
            int temp = second;
            second = Math.max(first + nums[i], second);
            first = temp;

        }
        return second;
    }

    /**
     * 递归解法的耗时很长
     */
//    public static int rob(int[] nums) {
//        return getMax(0,0,false,nums);
//    }
//    public static int getMax(int index,int max,boolean isLast, int[] nums){
//        if (index == nums.length){
//            return max;
//        }
//        int num1 =  getMax(index+1,max,false,nums);
//        int num2 =  isLast ? num1 : getMax(index+1,max+nums[index],true,nums);
//        return Math.max(num1, num2);
//    }

}
